/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jsysacc.asistencia.model.dao.component.maestros;

import com.cerd.util.BaseSP01.JUtilBaseSP01;
import com.jsysacc.asistencia.model.beans.maestros.MovimientoAsistencia;
import com.jsysacc.asistencia.model.dao.design.maestros.IMovimientoAsistenciaDAO;
import com.jsysacc.asistencia.model.dao.ds.Cnx;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import org.joda.time.DateTime;

/**
 *
 * @author Carlos
 */
public class MovimientoAsistenciaDAO extends JUtilBaseSP01 implements IMovimientoAsistenciaDAO {

    private Connection cnx = null;
    private PreparedStatement pst = null;
    private Statement stm = null;
    private ResultSet rs = null;
    private CallableStatement cs = null;

    @Override
    public boolean insert(MovimientoAsistencia entity) throws SQLException {
        cnx = Cnx.getConnection();
        cnx.setAutoCommit(false);
        try {

            String sql = " INSERT INTO " + Cnx.getSchema() + ".t_movimiento_asistencias(\n"
                    + "            fecha, cod_tip_asis, num_ide, cod_hor, descrip_hor, swt_cor, hor_ing_man, \n"
                    + "            hor_ing_man_rea, hor_sal_man, hor_sal_man_rea, hor_ing_tar, hor_ing_tar_rea, \n"
                    + "            hor_sal_tar, hor_sal_tar_rea,  min_tar_man, min_tar_tar, usu_reg, fec_reg)\n"
                    + "    VALUES ( ?, ?, ?, ?, ?, ?, \n"
                    + "            ?, ?, ?, ?, ?, \n"
                    + "            ?, ?, ?, ?, ?, ?, ?); ";

            pst = cnx.prepareStatement(sql);
            int pos = 1;
            pst.setDate(pos++, toDateTimeSQL(entity.getFecha()));
            pst.setString(pos++, entity.getCod_tip_asis());
            pst.setString(pos++, entity.getNum_ide());
            pst.setString(pos++, entity.getCod_hor());
            pst.setString(pos++, entity.getDescrip_hor());
            pst.setString(pos++, entity.getSwt_cor());
            pst.setString(pos++, entity.getHor_ing_man());
            pst.setString(pos++, entity.getHor_ing_man_rea());
            pst.setString(pos++, entity.getHor_sal_man());
            pst.setString(pos++, entity.getHor_sal_man_rea());
            pst.setString(pos++, entity.getHor_ing_tar());
            pst.setString(pos++, entity.getHor_ing_tar_rea());
            pst.setString(pos++, entity.getHor_sal_tar());
            pst.setString(pos++, entity.getHor_sal_tar_rea());
            pst.setInt(pos++, entity.getMin_tar_man());
            pst.setInt(pos++, toInt(toString(entity.getMin_tar_tar())));
            pst.setString(pos++, entity.getUsu_reg());
            pst.setTimestamp(pos++, toTimestampSQL(DateTime.now()));

            if (pst.executeUpdate() == 0) {
                throw new SQLException("ERROR AL INSERTAR EL REGISTRO");
            }
            cnx.commit();
            return true;
        } catch (SQLException ex) {
            cnx.rollback();
            throw new SQLException(ex.getMessage());
        } finally {
            try {
                if (pst != null) {
                    pst.close();
                }
                if (rs != null) {
                    rs.close();
                }
                if (cnx != null) {
                    cnx.close();
                }
            } catch (SQLException ex) {
                throw new SQLException(ex.getMessage());
            }
        }
    }

    @Override
    public boolean update(MovimientoAsistencia entity) throws SQLException {
        String sql = "UPDATE " + Cnx.getSchema() + ".t_movimiento_asistencias\n"
                + "   SET cod_tip_asis=?, cod_hor=?, descrip_hor=?, swt_cor=?, \n"
                + "       hor_ing_man=?, hor_ing_man_rea=?, hor_sal_man=?, hor_sal_man_rea=?, \n"
                + "       hor_ing_tar=?, hor_ing_tar_rea=?, hor_sal_tar=?, hor_sal_tar_rea=?, "
                + " min_tar_man = ?, min_tar_tar = ? \n"
                + " WHERE fecha = ? AND num_ide = ? ";
        cnx = Cnx.getConnection();
        cnx.setAutoCommit(false);
        try {
            pst = cnx.prepareCall(sql);
            int pos = 1;

            pst.setString(pos++, entity.getCod_tip_asis());
            pst.setString(pos++, entity.getCod_hor());
            pst.setString(pos++, entity.getDescrip_hor());
            pst.setString(pos++, entity.getSwt_cor());
            pst.setString(pos++, entity.getHor_ing_man());
            pst.setString(pos++, entity.getHor_ing_man_rea());
            pst.setString(pos++, entity.getHor_sal_man());
            pst.setString(pos++, entity.getHor_sal_man_rea());
            pst.setString(pos++, entity.getHor_ing_tar());
            pst.setString(pos++, entity.getHor_ing_tar_rea());
            pst.setString(pos++, entity.getHor_sal_tar());
            pst.setString(pos++, entity.getHor_sal_tar_rea());
            pst.setInt(pos++, entity.getMin_tar_man());
            pst.setInt(pos++, entity.getMin_tar_tar());
            pst.setDate(pos++, toDateTimeSQL(entity.getFecha()));
            pst.setString(pos++, entity.getNum_ide());

            if (pst.executeUpdate() == 0) {
                throw new SQLException("ERROR AL MODIFICAR EL REGISTRO");
            }
            cnx.commit();
            return true;
        } catch (SQLException ex) {
            cnx.rollback();
            throw new SQLException(ex.getMessage());
        } finally {
            try {
                if (pst != null) {
                    pst.close();
                }
                if (cnx != null) {
                    cnx.close();
                }
            } catch (SQLException ex) {
                throw new SQLException(ex.getMessage());
            }
        }
    }

    @Override
    public boolean delete(DateTime fecha, String num_ide) throws SQLException {
        String sql = " delete from " + Cnx.getSchema() + ".t_movimiento_asistencias where fecha = ? AND num_ide = ? ";
        cnx = Cnx.getConnection();
        cnx.setAutoCommit(false);
        try {
            pst = cnx.prepareStatement(sql);
            int pos = 1;
            pst.setDate(pos++, toDateTimeSQL(fecha));
            pst.setString(pos++, num_ide);

            if (pst.executeUpdate() == 0) {
                throw new SQLException("ERROR AL ELIMINAR EL REGISTRO");
            }
            cnx.commit();
            return true;
        } catch (SQLException ex) {
            cnx.rollback();
            throw new SQLException(ex.getMessage());
        } finally {
            try {
                if (pst != null) {
                    pst.close();
                }
                if (cnx != null) {
                    cnx.close();
                }
            } catch (SQLException ex) {
                throw new SQLException(ex.getMessage());
            }
        }
    }

    @Override
    public ArrayList<MovimientoAsistencia> getAll() throws SQLException {
        ArrayList<MovimientoAsistencia> lista = new ArrayList<>();
        MovimientoAsistencia oMovimientoAsistencia = null;
        String sql = " select * from " + Cnx.getSchema() + ".t_movimiento_asistencias order by id ";
        cnx = Cnx.getConnection();
        try {
            pst = cnx.prepareStatement(sql);
            rs = pst.executeQuery();
            while (rs.next()) {
                oMovimientoAsistencia = new MovimientoAsistencia();
                mapearBeanForRS(rs, oMovimientoAsistencia);
                lista.add(oMovimientoAsistencia);
            }
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (cnx != null) {
                    cnx.close();
                }
            } catch (SQLException ex) {
                throw new SQLException(ex.getMessage());
            }
        }

        return lista;
    }

    @Override
    public ArrayList<MovimientoAsistencia> getByCriterio(String criterio, String valor) throws SQLException {
        ArrayList<MovimientoAsistencia> lista = new ArrayList<>();
        MovimientoAsistencia oMovimientoAsistencia = null;
        String sql = " select * from " + Cnx.getSchema() + ".sp_t_personal_get_by_criterio(?, ?) ; ";
        cnx = Cnx.getConnection();
        try {
            pst = cnx.prepareStatement(sql);
            pst.setString(1, criterio);
            pst.setString(2, valor);
            rs = pst.executeQuery();
            while (rs.next()) {
                oMovimientoAsistencia = new MovimientoAsistencia();
                mapearBeanForRS(rs, oMovimientoAsistencia);
                lista.add(oMovimientoAsistencia);
            }
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (cnx != null) {
                    cnx.close();
                }
            } catch (SQLException ex) {
                throw new SQLException(ex.getMessage());
            }
        }

        return lista;
    }

    @Override
    public MovimientoAsistencia getByPk(DateTime fecha, String num_ide) throws SQLException {
        MovimientoAsistencia oMovimientoAsistencia = null;
        String sql = " select * from " + Cnx.getSchema() + ".t_movimiento_asistencias WHERE fecha = ?  AND num_ide = ? ; ";
        cnx = Cnx.getConnection();
        try {
            pst = cnx.prepareStatement(sql);
            int pos = 1;
            pst.setDate(pos++, toDateTimeSQL(fecha));
            pst.setString(pos++, num_ide);
            rs = pst.executeQuery();
            while (rs.next()) {
                oMovimientoAsistencia = new MovimientoAsistencia();
                mapearBeanForRS(rs, oMovimientoAsistencia);
            }
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pst != null) {
                    pst.close();
                }
                if (cnx != null) {
                    cnx.close();
                }
            } catch (SQLException ex) {
                throw new SQLException(ex.getMessage());
            }
        }

        return oMovimientoAsistencia;
    }

}
